#include "../inc/bmp.h"
#include "../inc/lcd.h"

//展示整个液晶屏图片
int bmp_show(char *bmpFile, int posX, int posY)
{
    //2、打开图片文件
    int bmpFd = open(bmpFile, O_RDONLY);
    if(bmpFd == -1)
    {
        perror("open bmp error");
        return -1;
    }
    //读取文件头 14
    struct tagBITMAPFILEHEADER bfh;
    read(bmpFd, &bfh, sizeof(bfh));

    //读取文件信息头  40
    struct tagBITMAPINFOHEADER bih;
    read(bmpFd, &bih, sizeof(bih));

    //宽度字节数4的倍数判断
    if((bih.biWidth*3) %4 != 0)
    {
        printf("图片宽度不是4的倍数\n");
        close(bmpFd);
        return -1;
    }
    //printf("宽度:%d, 高度:%d, 位深:%d\n", bih.biWidth, bih.biHeight, bih.biBitCount);
    //printf("文件大小:%d\n", bih.biSizeImage+54);

    int width = bih.biWidth;
    int height = bih.biHeight;

    //3、读取图片颜色数据 
    char bmpbuf[width*height*3] ; //一共是800*480个像素点，每个像素点3个字节
    read(bmpFd, bmpbuf, sizeof(bmpbuf));

    //将图像中的每个像素点 BGR 转换为 ARGB
    int tempbuf[width*height];//存储转换之后的颜色数据
    for(int i=0,j=0; i<width*height; i++,j+=3)
    {
        tempbuf[i] =0x00<<24 | bmpbuf[j+2]<<16 |  bmpbuf[j+1]<<8 |  bmpbuf[j] ;
    }

    //将图片进行上下颠倒
    int lcdbuf[height][width];
    for(int j=0; j<height; j++)
    {
        for(int i=0; i<width; i++)
        {
            lcdbuf[j][i] = tempbuf[(height-1-j) * width + i];
        }
    }   
    //再将数据赋值到液晶屏的映射内存空间中
    for(int j=0; j<height; j++)
    {
        for(int i=0; i<width; i++)
        {
            lcd_p[j+posY][i+posX] = lcdbuf[j][i];
        }
    }
    //6、关闭图片文件
    close(bmpFd);
}



//展示小图片
int bmp_show_small(char *bmpFile, int posX, int posY)
{
    //2、打开图片文件
    int bmpFd = open(bmpFile, O_RDONLY);
    if(bmpFd == -1)
    {
        perror("open bmp error");
        return -1;
    }
    //读取文件头 14
    struct tagBITMAPFILEHEADER bfh;
    read(bmpFd, &bfh, sizeof(bfh));

    //读取文件信息头  40
    struct tagBITMAPINFOHEADER bih;
    read(bmpFd, &bih, sizeof(bih));

    //宽度字节数4的倍数判断
    if((bih.biWidth*3) %4 != 0)
    {
        printf("图片宽度不是4的倍数\n");
        close(bmpFd);
        return -1;
    }
    //printf("宽度:%d, 高度:%d, 位深:%d\n", bih.biWidth, bih.biHeight, bih.biBitCount);
    //printf("文件大小:%d\n", bih.biSizeImage+54);

    int width = bih.biWidth;
    int height = bih.biHeight;

    //3、读取图片颜色数据 
    char bmpbuf[width*height*3] ; //一共是800*480个像素点，每个像素点3个字节
    read(bmpFd, bmpbuf, sizeof(bmpbuf));

    //将图像中的每个像素点 BGR 转换为 ARGB
    int tempbuf[width*height];//存储转换之后的颜色数据
    for(int i=0,j=0; i<width*height; i++,j+=3)
    {
        tempbuf[i] =0x00<<24 | bmpbuf[j+2]<<16 |  bmpbuf[j+1]<<8 |  bmpbuf[j] ;
    }

    //将图片进行上下颠倒
    int lcdbuf[height][width];
    for(int j=0; j<height; j++)
    {
        for(int i=0; i<width; i++)
        {
            lcdbuf[j][i] = tempbuf[(height-1-j) * width + i];
        }
    }   
    //再将数据赋值到液晶屏的映射内存空间中
    for(int j=0; j<height; j++)
    {
        for(int i=0; i<width; i++)
        {
            if(lcdbuf[j][i]==0x00ffffff||lcdbuf[j][i]==0x00000000){//如果遇到白色就跳过
                continue;
            }
            lcd_p[j+posY][i+posX] = lcdbuf[j][i];
        }
    }
    //6、关闭图片文件
    close(bmpFd);
}

//缩放图片
int bmp_scale(char *bmpFile, int posX, int posY,int scale)
{
    //2、打开图片文件
    int bmpFd = open(bmpFile, O_RDONLY);
    if(bmpFd == -1)
    {
        perror("open bmp error");
        return -1;
    }
    //读取文件头 14
    struct tagBITMAPFILEHEADER bfh;
    read(bmpFd, &bfh, sizeof(bfh));

    //读取文件信息头  40
    struct tagBITMAPINFOHEADER bih;
    read(bmpFd, &bih, sizeof(bih));

    //宽度字节数4的倍数判断
    if((bih.biWidth*3) %4 != 0)
    {
        printf("图片宽度不是4的倍数\n");
        close(bmpFd);
        return -1;
    }
    //printf("宽度:%d, 高度:%d, 位深:%d\n", bih.biWidth, bih.biHeight, bih.biBitCount);
    //printf("文件大小:%d\n", bih.biSizeImage+54);

    int width = bih.biWidth;
    int height = bih.biHeight;

    //3、读取图片颜色数据 
    char bmpbuf[width*height*3] ; //一共是800*480个像素点，每个像素点3个字节
    read(bmpFd, bmpbuf, sizeof(bmpbuf));

    //将图像中的每个像素点 BGR 转换为 ARGB
    int tempbuf[width*height];//存储转换之后的颜色数据
    for(int i=0,j=0; i<width*height; i++,j+=3)
    {
        tempbuf[i] =0x00<<24 | bmpbuf[j+2]<<16 |  bmpbuf[j+1]<<8 |  bmpbuf[j] ;
    }

    //将图片进行上下颠倒
    int lcdbuf[height][width];
    for(int j=0; j<height; j++)
    {
        for(int i=0; i<width; i++)
        {
            lcdbuf[j][i] = tempbuf[(height-1-j) * width + i];
        }
    }  

    //缩放图像处理
    int scale_width = width / scale;    
    int scale_height = height / scale;
    
    int scale_lcdbuf[scale_height][scale_width];    
    
    for(int j=0; j<scale_height; j++)
    {
        for(int i=0; i<scale_width; i++)
        {
            scale_lcdbuf[j][i] = lcdbuf[j*scale][i*scale];
        }   
    }


    //再将数据赋值到液晶屏的映射内存空间中
    for(int j=0; j<scale_height; j++)
    {
        for(int i=0; i<scale_width; i++)
        {
            lcd_p[j+posY][i+posX] = scale_lcdbuf[j][i];
        }
    }
    //6、关闭图片文件
    close(bmpFd);
}

// //得到线程运行前的图片
// void get_image_player_thread(int posX ){
//     //整一个玩家的全局变量
//     lcd_player[150][80] = {0};
//     for (int i = posY; i < pos_dr_Y; i++)//高
//     {
//         for (int j = posX; j < pos_dr_X; j++)//宽
//         {
//             arr[i - posY][j - posX] = lcd_p[i][posX];
//         }
//     }
// }

// //展示玩家小图片 另一个液晶屏文件描述符的显示
// int bmp_show_small_player(char *bmpFile, int posX, int posY)
// {
//     //2、打开图片文件
//     int bmpFd = open(bmpFile, O_RDONLY);
//     if(bmpFd == -1)
//     {
//         perror("open bmp error");
//         return -1;
//     }
//     //读取文件头 14
//     struct tagBITMAPFILEHEADER bfh;
//     read(bmpFd, &bfh, sizeof(bfh));

//     //读取文件信息头  40
//     struct tagBITMAPINFOHEADER bih;
//     read(bmpFd, &bih, sizeof(bih));

//     //宽度字节数4的倍数判断
//     if((bih.biWidth*3) %4 != 0)
//     {
//         printf("图片宽度不是4的倍数\n");
//         close(bmpFd);
//         return -1;
//     }
//     //printf("宽度:%d, 高度:%d, 位深:%d\n", bih.biWidth, bih.biHeight, bih.biBitCount);
//     //printf("文件大小:%d\n", bih.biSizeImage+54);

//     int width = bih.biWidth;
//     int height = bih.biHeight;

//     //3、读取图片颜色数据 
//     char bmpbuf[width*height*3] ; //一共是800*480个像素点，每个像素点3个字节
//     read(bmpFd, bmpbuf, sizeof(bmpbuf));

//     //将图像中的每个像素点 BGR 转换为 ARGB
//     int tempbuf[width*height];//存储转换之后的颜色数据
//     for(int i=0,j=0; i<width*height; i++,j+=3)
//     {
//         tempbuf[i] =0x00<<24 | bmpbuf[j+2]<<16 |  bmpbuf[j+1]<<8 |  bmpbuf[j] ;
//     }

//     //将图片进行上下颠倒
//     int lcdbuf[height][width];
//     for(int j=0; j<height; j++)
//     {
//         for(int i=0; i<width; i++)
//         {
//             lcdbuf[j][i] = tempbuf[(height-1-j) * width + i];
//         }
//     }   
//     //再将数据赋值到液晶屏的映射内存空间中
//     for(int j=0; j<height; j++)
//     {
//         for(int i=0; i<width; i++)
//         {
//             if(lcdbuf[j][i]==0x00ffffff||lcdbuf[j][i]==0x00000000){//如果遇到白色就跳过
//                 continue;
//             }
//             lcd_p_player[j+posY][i+posX] = lcdbuf[j][i];
//         }
//     }
//     //6、关闭图片文件
//     close(bmpFd);
// }

//进入系统时的龙猫妹妹随进度显示图片
